import type { AxiosRequestConfig, AxiosResponse } from 'axios'
import axios from 'axios'

// 获取后端地址
const getBackendUrl = () => {
  // 1. 优先使用配置文件中的设置
  const globalConfig = (window as any).DEVOPS_CONFIG
  if (globalConfig?.API_BASE_URL && globalConfig.API_BASE_URL.trim()) {
    return globalConfig.API_BASE_URL.trim()
  }

  // 2. 其次使用环境变量配置
  const envApiUrl = import.meta.env.VITE_API_BASE_URL
  if (envApiUrl && envApiUrl.trim()) {
    return envApiUrl.trim()
  }

  // 3. 同服务器部署：使用当前访问的主机名
  const hostname = window.location.hostname
  const protocol = window.location.protocol
  return `${protocol}//${hostname}:8000`
}

// 创建axios实例
const request = axios.create({
  baseURL: getBackendUrl(), // 动态后端地址
  timeout: 30000, // 30秒超时
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  }
})

// 请求拦截器
request.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    // 从localStorage获取token
    const token = localStorage.getItem('token')
    if (token && config.headers) {
      config.headers.Authorization = `Token ${token}`
    }

    // 如果是FormData，删除Content-Type让浏览器自动设置
    if (config.data instanceof FormData) {
      delete config.headers['Content-Type']
    }

    console.log(`🚀 API请求: ${config.method?.toUpperCase()} ${config.url}`, {
      data: config.data instanceof FormData ? 'FormData' : config.data,
      params: config.params,
      headers: config.headers
    })

    return config
  },
  (error) => {
    console.error('❌ 请求配置错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse) => {
    console.log(`✅ API响应: ${response.status} ${response.config.url}`, {
      data: response.data,
      headers: response.headers
    })
    return response
  },
  (error) => {
    const errorInfo = {
      url: error.config?.url || '未知URL',
      method: error.config?.method?.toUpperCase() || '未知方法',
      status: error.response?.status || '无响应',
      statusText: error.response?.statusText || '无状态文本',
      data: error.response?.data || null,
      message: error.message
    }

    console.error('❌ API响应错误:', errorInfo)

    // 根据错误状态码处理
    if (error.response) {
      const { status } = error.response

      switch (status) {
        case 401:
          console.warn('🚫 认证失败，请重新登录')
          // 清除token
          localStorage.removeItem('token')
          // 可以在这里添加跳转到登录页的逻辑
          break

        case 403:
          console.warn('🚫 权限不足')
          break

        case 404:
          console.warn('🔍 资源不存在')
          break

        case 500:
          console.error('💥 服务器内部错误')
          break

        default:
          console.error(`💥 HTTP错误 ${status}: ${error.response.statusText}`)
      }
    } else if (error.request) {
      console.error('🌐 网络错误，请检查网络连接')
    } else {
      console.error('⚙️ 请求配置错误:', error.message)
    }

    return Promise.reject(error)
  }
)

export default request
